#pragma once

#include <string>

// Window macro Define
#ifdef _WIN32

// #ifndef WINVER // Allow use of features specific to Windows 7 or later.
// #define WINVER 0x0700
// #endif

// #ifndef _WIN32_WINNT
// #define _WIN32_WINNT 0x0700
// #endif

#ifndef UNICODE
#define UNICODE
#endif

// #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

#include <windows.h>
#include <windowsx.h>
#include <winuser.h>

#endif

// Windows Message defines
enum KK_WIN_MSG
{
    KK_WIN_MSG_NONE = 0, // NONE
    KK_WIN_MSG_CREATE,   // 窗口创建
    KK_WIN_MSG_COMMAND,  // 窗口命令
    KK_WIN_MSG_CLOSE,    // 窗口关闭请求
    KK_WIN_MSG_DESTROY,  // 窗口销毁
    KK_WIN_MSG_PAINT,    // 窗口重绘
    KK_WIN_MSG_MOVE,     // 窗口移动
    KK_WIN_MSG_RESIZE,   // 窗口大小改变
    KK_WIN_MSG_ACTIVATE, // 窗口激活改变
    KK_WIN_MSG_SHOW,     // 窗口显示改变

    KK_WIN_MSG_KBD_UP,        // 键盘按键抬起消息
    KK_WIN_MSG_KBD_DOWN,      // 键盘按键按下消息
    KK_WIN_MSG_KBD_CHAR,      // 键盘字符消息
    KK_WIN_MSG_IME_CHAR,      // 输入法的字符消息
    KK_WIN_MSG_IME_CONTROL,   // 输入法的控制消息
    KK_WIN_MSG_MOUSE_KUP,     // 鼠标抬起消息
    KK_WIN_MSG_MOUSE_KDOWN,   // 鼠标按下消息
    KK_WIN_MSG_MOUSE_MOVE,    // 鼠标移动消息
    KK_WIN_MSG_MOUSE_DBCLICK, // 鼠标双击消息
    KK_WIN_MSG_MOUSE_WHEEL,   // 鼠标滚轮消息

    KK_WIN_MSG_TIMER,       // 定时器消息
    KK_WIN_MSG_CONTEXTMENU, // 内容菜单消息
    KK_WIN_MSG_COPYDATA,    // 复制数据消息
    KK_WIN_MSG_DROPS,       // 拖拽文件消息

    // cut, paste, copy, undo, redo
    // hscroll, vscroll

    KK_WIN_MSG_MAX,
};

struct KKPoint
{
    int x{0};
    int y{0};
    KKPoint(int x, int y) : x(x), y(y) {}
};

// 用于 padding, marggin, etc
struct KKSpace
{
    int x1{0}; // left
    int y1{0}; // top
    int x2{0}; // right
    int y2{0}; // bottom
    KKSpace(int x1, int y1, int x2, int y2) : x1(x1), y1(y1), x2(x2), y2(y2) {}
    KKSpace(int val) : x1(val), y1(val), x2(val), y2(val) {}
    bool isNull() { return x1 == 0 && y1 == 0 && x2 == 0 && y2 == 0; }
};

struct KKRect
{
    int x1{0}; // top left point
    int y1{0};
    int x2{0}; // bottom right point
    int y2{0};
    KKRect(int x1, int y1, int x2, int y2) : x1(x1), y1(y1), x2(x2), y2(y2) {}
    KKRect(int val) : x1(val), y1(val), x2(val), y2(val) {}
    // 向外扩展
    KKRect add(KKSpace sp) { return KKRect(x1 - sp.x1, y1 - sp.y1, x2 + sp.x2, y2 + sp.y2); }
    // 向内收缩
    KKRect sub(KKSpace sp) { return KKRect(x1 + sp.x1, y1 + sp.y1, x2 - sp.x2, y2 - sp.y2); }
};

// component defines
struct KKColor
{
    unsigned char r{0};
    unsigned char g{0};
    unsigned char b{0};
    unsigned char a{255};

    KKColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255) : r(r), g(g), b(b), a(a) {}
    KKColor(unsigned int hex)
    {
        if (hex > 0x00FFFFFF)
        {
            r = (hex >> 24) & 0xFF;
            g = (hex >> 16) & 0xFF;
            b = (hex >> 8) & 0xFF;
            a = hex & 0xFF;
        }
        else
        {
            r = (hex >> 16) & 0xFF;
            g = (hex >> 8) & 0xFF;
            b = hex & 0xFF;
            a = 0xFF;
        }
    }
};

struct KKSpaceColor
{
    KKColor x1; // left
    KKColor y1; // top
    KKColor x2; // right
    KKColor y2; // bottom

    KKSpaceColor(KKColor color) : x1(color), y1(color), x2(color), y2(color) {}
};

enum KK_WIN_FLAGS
{
    KK_WIN_FLAG_NONE = 0x00,           // Default
    KK_WIN_FLAG_DIS_CLOSE = 0x01 << 0, // 窗口不可关闭
    KK_WIN_FLAG_FIXED = 0x01 << 1,     // 窗口固定大小
    KK_WIN_FLAG_DBCLICK = 0x01 << 2,   // 窗口支持鼠标双击事件
    KK_WIN_FLAG_FRAMELESS = 0x01 << 3, // 窗口无边框
};

// key message

// 系统辅助按键的状态，可以同时存在多个
enum KK_KBD_SYS
{
    KK_KBD_SYS_NONE = 0x00,
    KK_KBD_SYS_CTRL = 0x01 << 0,
    KK_KBD_SYS_SHIFT = 0x01 << 1,
    KK_KBD_SYS_ALT = 0x01 << 2,
    KK_KBD_SYS_WIN = 0x01 << 3,
};

// https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes
enum KK_KBD_VK
{
    KK_KBD_VK_NONE = 0x00,
    KK_KBD_VK_LBUTTON = 0x01,  // 鼠标左键
    KK_KBD_VK_RBUTTON = 0x02,  // 鼠标右键
    KK_KBD_VK_CANCEL = 0x03,   // 控制中断处理
    KK_KBD_VK_MBUTTON = 0x04,  // 鼠标中键
    KK_KBD_VK_XBUTTON1 = 0x05, // X1 鼠标按钮
    KK_KBD_VK_XBUTTON2 = 0x06, // X2 鼠标按钮
    // KK_KBD_ -= 0x07,                      // 保留
    KK_KBD_VK_BACK = 0x08, // BACKSPACE 键
    KK_KBD_VK_TAB = 0x09,  // Tab 键
    // KK_KBD_ -= 0x0A - 0B,                 // 预留
    KK_KBD_VK_CLEAR = 0x0C,  // CLEAR 键
    KK_KBD_VK_RETURN = 0x0D, // Enter 键
    // KK_KBD_ -= 0x0E - 0F,                 // 未分配
    KK_KBD_VK_SHIFT = 0x10,      // SHIFT 键
    KK_KBD_VK_CONTROL = 0x11,    // CTRL 键
    KK_KBD_VK_MENU = 0x12,       // Alt 键
    KK_KBD_VK_PAUSE = 0x13,      // PAUSE 键
    KK_KBD_VK_CAPITAL = 0x14,    // CAPS LOCK 键
    KK_KBD_VK_KANA = 0x15,       // IME Kana 模式
    KK_KBD_VK_HANGUL = 0x15,     // IME Hanguel 模式
    KK_KBD_VK_IME_ON = 0x16,     // IME 打开
    KK_KBD_VK_JUNJA = 0x17,      // IME Junja 模式
    KK_KBD_VK_FINAL = 0x18,      // IME 最终模式
    KK_KBD_VK_HANJA = 0x19,      // IME Hanja 模式
    KK_KBD_VK_KANJI = 0x19,      // IME Kanji 模式
    KK_KBD_VK_IME_OFF = 0x1A,    // IME 关闭
    KK_KBD_VK_ESCAPE = 0x1B,     // ESC 键
    KK_KBD_VK_CONVERT = 0x1C,    // IME 转换
    KK_KBD_VK_NONCONVERT = 0x1D, // IME 不转换
    KK_KBD_VK_ACCEPT = 0x1E,     // IME 接受
    KK_KBD_VK_MODECHANGE = 0x1F, // IME 模式更改请求
    KK_KBD_VK_SPACE = 0x20,      // 空格键
    KK_KBD_VK_PRIOR = 0x21,      // PAGE UP 键
    KK_KBD_VK_NEXT = 0x22,       // PAGE DOWN 键
    KK_KBD_VK_END = 0x23,        // END 键
    KK_KBD_VK_HOME = 0x24,       // HOME 键
    KK_KBD_VK_LEFT = 0x25,       // LEFT ARROW 键
    KK_KBD_VK_UP = 0x26,         // UP ARROW 键
    KK_KBD_VK_RIGHT = 0x27,      // RIGHT ARROW 键
    KK_KBD_VK_DOWN = 0x28,       // DOWN ARROW 键
    KK_KBD_VK_SELECT = 0x29,     // SELECT 键
    KK_KBD_VK_PRINT = 0x2A,      // PRINT 键
    KK_KBD_VK_EXECUTE = 0x2B,    // EXECUTE 键
    KK_KBD_VK_SNAPSHOT = 0x2C,   // PRINT SCREEN 键
    KK_KBD_VK_INSERT = 0x2D,     // INS 键
    KK_KBD_VK_DELETE = 0x2E,     // DEL 键
    KK_KBD_VK_HELP = 0x2F,       // HELP 键
    KK_KBD_VK_0 = 0x30,          // 0 键
    KK_KBD_VK_1 = 0x31,          // 1 个键
    KK_KBD_VK_2 = 0x32,          // 2 键
    KK_KBD_VK_3 = 0x33,          // 3 键
    KK_KBD_VK_4 = 0x34,          // 4 键
    KK_KBD_VK_5 = 0x35,          // 5 键
    KK_KBD_VK_6 = 0x36,          // 6 键
    KK_KBD_VK_7 = 0x37,          // 7 键
    KK_KBD_VK_8 = 0x38,          // 8 键
    KK_KBD_VK_9 = 0x39,          // 9 键
    // KK_KBD_ -= 0x3A - 40,                 // Undefined
    KK_KBD_VK_A = 0x41,    // A 键
    KK_KBD_VK_B = 0x42,    // B 键
    KK_KBD_VK_C = 0x43,    // C 键
    KK_KBD_VK_D = 0x44,    // D 键
    KK_KBD_VK_E = 0x45,    // E 键
    KK_KBD_VK_F = 0x46,    // F 键
    KK_KBD_VK_G = 0x47,    // G 键
    KK_KBD_VK_H = 0x48,    // H 键
    KK_KBD_VK_I = 0x49,    // I 键
    KK_KBD_VK_J = 0x4A,    // J 键
    KK_KBD_VK_K = 0x4B,    // K 键
    KK_KBD_VK_L = 0x4C,    // L 键
    KK_KBD_VK_M = 0x4D,    // M 键
    KK_KBD_VK_N = 0x4E,    // N 键
    KK_KBD_VK_O = 0x4F,    // O 键
    KK_KBD_VK_P = 0x50,    // P 键
    KK_KBD_VK_Q = 0x51,    // Q 键
    KK_KBD_VK_R = 0x52,    // R 键
    KK_KBD_VK_S = 0x53,    // S 键
    KK_KBD_VK_T = 0x54,    // T 键
    KK_KBD_VK_U = 0x55,    // U 键
    KK_KBD_VK_V = 0x56,    // V 键
    KK_KBD_VK_W = 0x57,    // W 键
    KK_KBD_VK_X = 0x58,    // X 键
    KK_KBD_VK_Y = 0x59,    // Y 键
    KK_KBD_VK_Z = 0x5A,    // Z 键
    KK_KBD_VK_LWIN = 0x5B, // 左 Windows 键
    KK_KBD_VK_RWIN = 0x5C, // 右侧 Windows 键
    KK_KBD_VK_APPS = 0x5D, // 应用程序密钥
    // KK_KBD_ -= 0x5E,                      // 预留
    KK_KBD_VK_SLEEP = 0x5F,     // 计算机休眠键
    KK_KBD_VK_NUMPAD0 = 0x60,   // 数字键盘 0 键
    KK_KBD_VK_NUMPAD1 = 0x61,   // 数字键盘 1 键
    KK_KBD_VK_NUMPAD2 = 0x62,   // 数字键盘 2 键
    KK_KBD_VK_NUMPAD3 = 0x63,   // 数字键盘 3 键
    KK_KBD_VK_NUMPAD4 = 0x64,   // 数字键盘 4 键
    KK_KBD_VK_NUMPAD5 = 0x65,   // 数字键盘 5 键
    KK_KBD_VK_NUMPAD6 = 0x66,   // 数字键盘 6 键
    KK_KBD_VK_NUMPAD7 = 0x67,   // 数字键盘 7 键
    KK_KBD_VK_NUMPAD8 = 0x68,   // 数字键盘 8 键
    KK_KBD_VK_NUMPAD9 = 0x69,   // 数字键盘 9 键
    KK_KBD_VK_MULTIPLY = 0x6A,  // 乘号键
    KK_KBD_VK_ADD = 0x6B,       // 加号键
    KK_KBD_VK_SEPARATOR = 0x6C, // 分隔符键
    KK_KBD_VK_SUBTRACT = 0x6D,  // 减号键
    KK_KBD_VK_DECIMAL = 0x6E,   // 句点键
    KK_KBD_VK_DIVIDE = 0x6F,    // 除号键
    KK_KBD_VK_F1 = 0x70,        // F1 键
    KK_KBD_VK_F2 = 0x71,        // F2 键
    KK_KBD_VK_F3 = 0x72,        // F3 键
    KK_KBD_VK_F4 = 0x73,        // F4 键
    KK_KBD_VK_F5 = 0x74,        // F5 键
    KK_KBD_VK_F6 = 0x75,        // F6 键
    KK_KBD_VK_F7 = 0x76,        // F7 键
    KK_KBD_VK_F8 = 0x77,        // F8 键
    KK_KBD_VK_F9 = 0x78,        // F9 键
    KK_KBD_VK_F10 = 0x79,       // F10 键
    KK_KBD_VK_F11 = 0x7A,       // F11 键
    KK_KBD_VK_F12 = 0x7B,       // F12 键
    KK_KBD_VK_F13 = 0x7C,       // F13 键
    KK_KBD_VK_F14 = 0x7D,       // F14 键
    KK_KBD_VK_F15 = 0x7E,       // F15 键
    KK_KBD_VK_F16 = 0x7F,       // F16 键
    KK_KBD_VK_F17 = 0x80,       // F17 键
    KK_KBD_VK_F18 = 0x81,       // F18 键
    KK_KBD_VK_F19 = 0x82,       // F19 键
    KK_KBD_VK_F20 = 0x83,       // F20 键
    KK_KBD_VK_F21 = 0x84,       // F21 键
    KK_KBD_VK_F22 = 0x85,       // F22 键
    KK_KBD_VK_F23 = 0x86,       // F23 键
    KK_KBD_VK_F24 = 0x87,       // F24 键
    // KK_KBD_ -= 0x88 - 8F,                 // 保留
    KK_KBD_VK_NUMLOCK = 0x90, // NUM LOCK 键
    KK_KBD_VK_SCROLL = 0x91,  // SCROLL LOCK 键
    // KK_KBD_ -= 0x92 - 96,                 // OEM 特有
    // KK_KBD_ -= 0x97 - 9F,                 // 未分配
    KK_KBD_VK_LSHIFT = 0xA0,              // 左 SHIFT 键
    KK_KBD_VK_RSHIFT = 0xA1,              // 右 SHIFT 键
    KK_KBD_VK_LCONTROL = 0xA2,            // 左 Ctrl 键
    KK_KBD_VK_RCONTROL = 0xA3,            // 右 Ctrl 键
    KK_KBD_VK_LMENU = 0xA4,               // 左 ALT 键
    KK_KBD_VK_RMENU = 0xA5,               // 右 ALT 键
    KK_KBD_VK_BROWSER_BACK = 0xA6,        // 浏览器后退键
    KK_KBD_VK_BROWSER_FORWARD = 0xA7,     // 浏览器前进键
    KK_KBD_VK_BROWSER_REFRESH = 0xA8,     // 浏览器刷新键
    KK_KBD_VK_BROWSER_STOP = 0xA9,        // 浏览器停止键
    KK_KBD_VK_BROWSER_SEARCH = 0xAA,      // 浏览器搜索键
    KK_KBD_VK_BROWSER_FAVORITES = 0xAB,   // 浏览器收藏键
    KK_KBD_VK_BROWSER_HOME = 0xAC,        // 浏览器“开始”和“主页”键
    KK_KBD_VK_VOLUME_MUTE = 0xAD,         // 静音键
    KK_KBD_VK_VOLUME_DOWN = 0xAE,         // 音量减小键
    KK_KBD_VK_VOLUME_UP = 0xAF,           // 音量增加键
    KK_KBD_VK_MEDIA_NEXT_TRACK = 0xB0,    // 下一曲目键
    KK_KBD_VK_MEDIA_PREV_TRACK = 0xB1,    // 上一曲目键
    KK_KBD_VK_MEDIA_STOP = 0xB2,          // 停止媒体键
    KK_KBD_VK_MEDIA_PLAY_PAUSE = 0xB3,    // 播放/暂停媒体键
    KK_KBD_VK_LAUNCH_MAIL = 0xB4,         // 启动邮件键
    KK_KBD_VK_LAUNCH_MEDIA_SELECT = 0xB5, // 选择媒体键
    KK_KBD_VK_LAUNCH_APP1 = 0xB6,         // 启动应用程序 1 键
    KK_KBD_VK_LAUNCH_APP2 = 0xB7,         // 启动应用程序 2 键
    // KK_KBD_ -= 0xB8 - B9,                 // 预留
    KK_KBD_VK_OEM_1 = 0xBA,      // 用于杂项字符；它可能因键盘而异。 对于美国标准键盘，键;:
    KK_KBD_VK_OEM_PLUS = 0xBB,   // 对于任何国家/地区，键+
    KK_KBD_VK_OEM_COMMA = 0xBC,  // 对于任何国家/地区，键,
    KK_KBD_VK_OEM_MINUS = 0xBD,  // 对于任何国家/地区，键-
    KK_KBD_VK_OEM_PERIOD = 0xBE, // 对于任何国家/地区，键.
    KK_KBD_VK_OEM_2 = 0xBF,      // 用于杂项字符；它可能因键盘而异。 对于美国标准键盘，键/?
    KK_KBD_VK_OEM_3 = 0xC0,      // 用于杂项字符；它可能因键盘而异。 对于美国标准键盘，键`~
    // KK_KBD_ -= 0xC1 - DA,                 // 保留
    KK_KBD_VK_OEM_4 = 0xDB, // 用于杂项字符；它可能因键盘而异。 对于美国标准键盘，键[{
    KK_KBD_VK_OEM_5 = 0xDC, // 用于杂项字符；它可能因键盘而异。 对于美国标准键盘，键\\|
    KK_KBD_VK_OEM_6 = 0xDD, // 用于杂项字符；它可能因键盘而异。 对于美国标准键盘，键]}
    KK_KBD_VK_OEM_7 = 0xDE, // 用于杂项字符；它可能因键盘而异。 对于美国标准键盘，键'"
    KK_KBD_VK_OEM_8 = 0xDF, // 用于杂项字符；它可能因键盘而异。
    // KK_KBD_ -= 0xE0,                      // 预留
    // KK_KBD_ -= 0xE1,                      // OEM 特有
    KK_KBD_VK_OEM_102 = 0xE2, // 美国标准键盘上的 <> 键，或非美国 102 键键盘上的 \\| 键
    // KK_KBD_ -= 0xE3 - E4,                 // OEM 特有
    KK_KBD_VK_PROCESSKEY = 0xE5, // IME PROCESS 键
    // KK_KBD_ -= 0xE6,                      // OEM 特有
    KK_KBD_VK_PACKET = 0xE7, // 用于将 Unicode
                             // 字符当作键击传递。 VK_PACKET 键是用于非键盘输入法的 32
                             // 位虚拟键值的低位字。
                             // 有关更多信息，请参阅 KEYBDINPUT、SendInput、WM_KEYDOWN 和 WM_KEYUP 中的注释
    // KK_KBD_ -= 0xE8,                      // 未分配
    // KK_KBD_ -= 0xE9 - F5,                 // OEM 特有
    KK_KBD_VK_ATTN = 0xF6,      // Attn 键
    KK_KBD_VK_CRSEL = 0xF7,     // CrSel 键
    KK_KBD_VK_EXSEL = 0xF8,     // ExSel 键
    KK_KBD_VK_EREOF = 0xF9,     // Erase EOF 键
    KK_KBD_VK_PLAY = 0xFA,      // Play 键
    KK_KBD_VK_ZOOM = 0xFB,      // Zoom 键
    KK_KBD_VK_NONAME = 0xFC,    // 预留
    KK_KBD_VK_PA1 = 0xFD,       // PA1 键
    KK_KBD_VK_OEM_CLEAR = 0xFE, // Clear 键
                                // KK_KBD_=, // 未分配
};

// mouse message
enum KK_MOUSE_BTN
{
    KK_MOUSE_BTN_NONE = 0x00,
    KK_MOUSE_BTN_L = 0x01 << 0,
    KK_MOUSE_BTN_R = 0x01 << 1,
    KK_MOUSE_BTN_MID = 0x01 << 2,
    KK_MOUSE_BTN_MOVE = 0x01 << 3,
    KK_MOUSE_BTN_WHEEL = 0x01 << 4,
    KK_MOUSE_BTN_L_DCLICK = 0x01 << 5,
    KK_MOUSE_BTN_R_DCLICK = 0x01 << 6,
};

enum KK_TEXT_ALIGN
{
    KK_TEXT_ALIGN_LEFT = 0, // left or top
    KK_TEXT_ALIGN_CENTER,   // center
    KK_TEXT_ALIGN_RIGHT,    // right or bottom
    KK_TEXT_ALIGN_FLEX,     // flex auto calc, only used in flex layout
};

enum KK_IMAGE_FIT
{
    KK_IMAGE_FIT_FILL = 0, // 拉伸填充
    KK_IMAGE_FIT_CONTAIN,  // 等比缩放，保留白边
    KK_IMAGE_FIT_COVER,    // 覆盖，隐藏部分图片，不留白边, 更推荐
    KK_IMAGE_FIT_REPEAT,   // 重复填充
};

// https://learn.microsoft.com/zh-cn/windows/win32/menurc/about-cursors
enum KK_CURSOR_STYLE
{
    KK_CURSOR_STYLE_ARROW = 0,   // 正常选择 IDC_CROSS
    KK_CURSOR_STYLE_IBEAM,       // 文本选择或输入 IDC_IBEAM
    KK_CURSOR_STYLE_WAIT,        // 忙碌 IDC_WAIT
    KK_CURSOR_STYLE_CROSS,       // 十字 IDC_CROSS
    KK_CURSOR_STYLE_UPARROW,     // 向上箭头 IDC_UPARROW
    KK_CURSOR_STYLE_SIZENWSE,    // 对角线1 IDC_SIZENWSE
    KK_CURSOR_STYLE_SIZENESW,    // 对角线2 IDC_SIZENESW
    KK_CURSOR_STYLE_SIZEWE,      // 左右箭头 IDC_SIZEWE
    KK_CURSOR_STYLE_SIZENS,      // 上下箭头 IDC_SIZENS
    KK_CURSOR_STYLE_SIZEALL,     // 四角箭头 IDC_SIZEALL
    KK_CURSOR_STYLE_NO,          // 禁止 IDC_NO
    KK_CURSOR_STYLE_HAND,        // 手 IDC_HAND
    KK_CURSOR_STYLE_APPSTARTING, // 后台忙碌 IDC_APPSTARTING
    KK_CURSOR_STYLE_HELP,        // 帮助 IDC_HELP
};

enum KK_LINE_STYLE
{
    KK_LINE_STYLE_SOLID = 0,
    KK_LINE_STYLE_DASHED,
    KK_LINE_STYLE_DOTTED,
    KK_LINE_STYLE_DASHDOT,
    KK_LINE_STYLE_DASHDOTDOT,
};

enum KK_LINE_CAP
{
    KK_LINE_CAP_FLAT = 0,
    KK_LINE_CAP_ROUND,
    KK_LINE_CAP_SQUARE,
    KK_LINE_CAP_TRIANGLE
};

enum KK_LINE_JOIN
{
    KK_LINE_JOIN_MITER = 0,
    KK_LINE_JOIN_BEVEL,
    KK_LINE_JOIN_ROUND,
    KK_LINE_JOIN_MITER_CLIPPED,
};

std::wstring text_utf8_to_utf16(const std::string &utf8);
std::string text_utf16_to_utf8(const std::wstring &utf16);

struct KKEvent
{
    KK_WIN_MSG msg{KK_WIN_MSG_NONE};
    unsigned int msg_native{0};
    bool ready{false};
    KKPoint pos{0, 0};
    KK_MOUSE_BTN mouse_btn{KK_MOUSE_BTN_NONE};
    int sys{KK_KBD_SYS_NONE}; // 键盘系统键
    int value{0};             // 鼠标滚轮值或键盘 KK_KBD_VK_* 值
};
